package rpg.console;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;

public class CommandParser {

    private HashMap<String, Command> commands;
    private String com;
    private static CommandParser instance;

    public CommandParser() {
        addCommands();
    }

    public static CommandParser getInstance() {
        if (instance == null) {
            instance = new CommandParser();
        }
        return instance;
    }

    /**
     * Ez adja hozza a parancsokat a HashMaphez
     */
    private void addCommands() {
        commands = new HashMap<String, Command>();

        commands.put("hello", new Command("hello", "koszon a usernak", 0) {
            @Override
            public void runCommand(String[] params) {
                printToConsole("Csá!");
            }
        });

        commands.put("help", new Command("help", "kiirja a parancsokat", 0) { // a commandot belehajítjuk a hashmapbe
            @Override //overrideoljuk a Commandnak a runCommandját, beleírjuk mi a rákot csináljon a parancs
            public void runCommand(String[] params) {
                LinkedList<String> cmds = new LinkedList<String>(commands.keySet()); //kivesszük a kulcsokat a hashmapből
                Collections.sort(cmds); //rendezzük őket (ABC sorrendbe)				
                for (String s : cmds) {
                    Command c = commands.get(s); // lekérjük a String alapján a Commandot
                    if (c == null) {
                        continue; // ha null, nem akarunk NullPointerExceptiont kapni, továbbmegyünk
                    }
                    printToConsole(s + ": " + c.help);
                }
            }
        });

        commands.put("params", new Command("params", "kiirja a parametereket", 0) {
            @Override
            public void runCommand(String[] params) {
                for (String s : params) {
                    printToConsole(s);
                }
            }
        });

        /**
         * Ez a parancs az összes megkapott paramétert használni fogja
         */
        commands.put("osszead", new Command("osszead", "{szamok} - osszeadja a parameterben szereplo szamokat", 2) { // összead legalább két számot
            @Override
            public void runCommand(String[] params) {
                int sum = 0;
                for (String s : params) {
                    try {
                        sum += Integer.parseInt(s);
                    } catch (NumberFormatException nfe) {
                        printToConsole("A \"" + s + "\" az nem szam!");
                        return;
                    }
                }
                printToConsole("Osszeg: " + sum);
            }
        });

        /**
         * Ez a parancs meg az elso parameter alapjan osszeadja, vagy kivonja a
         * tobbi parametert
         */
        commands.put("szamol", new Command("szamol", "[+|-] {szamok} - osszeadja vagy kivonja a szamokat", 3) {
            @Override
            public void runCommand(String[] params) {
                char c = params[0].charAt(0);
                int out = 0;
                switch (c) {
                    case '+':
                        for (int i = 1; i < params.length; ++i) {
                            try {
                                out += Integer.parseInt(params[i]);
                            } catch (NumberFormatException nfe) {
                                printToConsole("A \"" + params[i] + "\" az nem szam!");
                                return;
                            }
                        }
                        break;
                    case '-':
                        try {
                            out = Integer.parseInt(params[1]);
                        } catch (NumberFormatException nfe) {
                            printToConsole("A \"" + params[1] + "\" az nem szam!");
                            return;
                        }
                        for (int i = 2; i < params.length; ++i) {
                            try {
                                out -= Integer.parseInt(params[i]);
                            } catch (NumberFormatException nfe) {
                                printToConsole("A \"" + params[i] + "\" az nem szám!");
                                return;
                            }
                        }
                        break;
                    default:
                        printToConsole(c + " nem ismert paraméter");
                        return;
                }
                printToConsole("Eredmeny: " + out);
            }
        });

        commands.put("exit", new Command("exit", "kilep a játékból", 0) {
            @Override
            public void runCommand(String[] params) {
                System.exit(0);
            }
        });
    }

    public void tryRun(String line) {
        line = line.trim().replaceAll("\\s+", " "); //kiszedjük belőle a fölösleges szóközöket
        String[] split = line.split("\\s");
        String cmd = split[0];
        String[] params = new String[split.length - 1];
        for (int i = 1; i < split.length; ++i) {
            params[i - 1] = split[i];
        }
        Command c = commands.get(cmd.toLowerCase());
        if (c == null) {
            printToConsole("Nincs olyan parancs hogy " + cmd);
            return;
        }
        c.canRun(params);
    }
    
    private void printToConsole(String s){
        Console c = Console.getInstance();
        c.printLine(s);
    }
}
